import LayerManager from "../../scripts/main/LayerManager";
import ToastBase from "../components/toast/ToastBase";

/**
 * Toast管理器
 * @see ToastManager.ts 
 */
export default class ToastManager {

    /** 节点表 */
    private static nodeMap: Map<string, cc.Node> = new Map<string, cc.Node>();

    /** 弹窗动态加载开始回调 */
    public static loadStartCallback: Function = null;

    /** 弹窗动态加载结束回调 */
    public static loadFinishCallback: Function = null;

    /**默认预制体路径 */
    public static defaultPath: string = 'prefabs/toast/toast';


    /**
     * 展示Toast
     * @param msg toast消息
     * @param path 弹窗预制体相对路径（如：prefabs/MyPopup）
     */
    public static async show(msg: string = '', path: string = this.defaultPath): Promise<boolean> {
        return new Promise(async res => {
            // 先在缓存中获取
            let node: cc.Node = this.getNodeFromCache(path);
            // 缓存中没有，动态加载预制体资源
            if (!cc.isValid(node)) {
                this.loadStartCallback && this.loadStartCallback();
                // 等待加载
                await new Promise(res => {
                    cc.resources.load(path, (error: Error, prefab: cc.Prefab) => {
                        if (!error) {
                            prefab.addRef();                    // 增加引用计数
                            node = cc.instantiate(prefab);      // 实例化节点
                        }
                        res();
                    });
                });
                this.loadFinishCallback && this.loadFinishCallback();
            }
            // 加载失败（一般是路径错误导致的）
            if (!cc.isValid(node)) {
                cc.warn('[ToastManager]', '预制体加载失败', path);
                return res(false);
            }
            let midContainer = LayerManager.instance.EffectLayer.getChildByName('midContainer');
            // 添加到场景中
            node.setParent(midContainer);
            // 显示在最上层
            node.setSiblingIndex(cc.macro.MAX_ZINDEX);

            // 获取继承于 ToastBase 的弹窗组件
            const toast = node.getComponent(ToastBase);
            if (toast) {
                // 设置完成回调
                toast.setFinishCallback(() => {
                    this.recycle(path, node);
                    res(true);
                });
                toast.show(msg);
            } else {
                // 没有 ToastBase 组件则直接打开节点
                node.active = true;
                res(true);
            }
        });
    }

    /**
     * 从缓存中获取节点
     * @param path 路径
     */
    private static getNodeFromCache(path: string): cc.Node {
        // const node = this.nodeMap.get(path);
        // if (cc.isValid(node)) {
        //     return node;
        // }
        // this.nodeMap.delete(path);
        return null;
    }

    /**
     * 回收弹窗
     * @param path 弹窗路径
     * @param node 弹窗节点
     * @param mode 缓存模式
     */
    private static recycle(path: string, node: cc.Node): void {
        if (!this.nodeMap.has(path)) {
            this.nodeMap.set(path, node);
        }
        node.removeFromParent(false);
    }
}
